// 创建唯一uuid
function uuid() {
  var s = [];
  var hexDigits = "0123456789abcdef";
  for (var i = 0; i < 36; i++) {
      s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[8] = s[13] = s[18] = s[23] = "-";

  var uuid = s.join("");
  return uuid;
};

// 获取DOM元素
function getDom(_document, _value, type = 'id') {
  let dom = null;

  if(_value) {
    try {
      switch(type) {
        case 'id':
          dom = (_document || document).getElementById(_value);
          break;
        case 'class':
          dom = (_document || document).getElementsByClassName(_value);
          break;
        case 'tag':
          dom = (_document || document).getElementsByTagName(_value);
          break;
        default:
          break;
      }
    } catch (error) {
      console.log(error);
    }
  }

  return dom;
}

// 连接webSocket后端服务器
function connectwebSocket(path) {
  return io(path || 'http://localhost:3000/');
}

// 获取浏览器的宽高
function getBrowserWH(_document) {
  const d = _document || document;
  const w = window;
  const obj = {}

  if(d && w){
    obj.width = d.body.scrollWidth + 'px';
    // 视口高度
      //  document.documentElement.clientHeight: 获取浏览器窗口文档显示区域的高度，不包括滚动条
    obj.height = (d.documentElement.clientHeight || d.body.clientHeight || w.innerHeight) + 'px';
  }

  return obj;  
}

// 下划线转驼峰
const underlineToHump = (str) => {
  if(str) new Error('字段不能为空！');

  // 字段数组
  const arr = str.split('_') || [];

  // 第一个字段
  const first = arr[0];

  // 除第一个字段外其余字段
  const _arr = [...arr];
  _arr.shift();

  // 进行 后续字段首字母大写操作
  const _actArr = _arr.map(item => {
    // 获取首字母并大写
    const head = (item.slice(0, 1)).toUpperCase();
    // 获取除第一个字母外其它字母
    const other = item.slice(1);

    return head + other;
  });

  // 实际数据
  const actArr = [first, ..._actArr];

  return actArr.join('');
}

// 驼峰转连接线
function humpToConnectline(str){
  return str.replace(/([A-Z])/g, '-$1').toLowerCase()
}

// 根据节点属性的map获取属性的key-value对象
function getCustomProps(map = new Map()) {
  let obj = {};

  try {
    [].forEach.call(map, item => {
      const { nodeName, nodeValue } = item;

      let _nodeName = nodeName;
      // 处理-连接的key
      _nodeName = underlineToHump(nodeName.replace(/-/g, '_'));

      // 处理值为'true'和'false'字符串
      let _nodeValue = nodeValue;
      switch (nodeValue) {
        case 'true':
          _nodeValue = true;
          break;
        case 'false':
          _nodeValue = false;
          break;
        default:
          break;
      }

      obj[_nodeName] = _nodeValue;
    })
  } catch (error) {
    console.log(error);
  }

  return obj;
}
